package com.zhihao.domain.activity.repository;

import com.zhihao.domain.activity.model.aggregate.CreatePartakeOrderAggregate;
import com.zhihao.domain.activity.model.aggregate.CreateQuotaOrderAggregate;
import com.zhihao.domain.activity.model.entity.*;
import com.zhihao.domain.activity.model.valobj.ActivitySkuStockKeyVO;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * @author Jackson
 * @description 活动仓储接口
 * @create 2024-03-16 10:31
 */
public interface IActivityRepository {

    /* 查询活动sku库存信息 */
    ActivitySkuEntity queryActivitySku(Long sku);

    /* 查询抽奖活动信息 */
    ActivityEntity queryRaffleActivityByActivityId(Long activityId);

    /* 查询抽奖活动次数根据活动次数实体对象 */
    ActivityCountEntity queryRaffleActivityCountByActivityCountId(Long activityCountId);

    /* 查询用户积分值 */
    BigDecimal queryUserCreditAccountAmount(String userId);

    /* 无需支付的活动订单---签到返利活动次数 */
    void doSaveNoPayOrder(CreateQuotaOrderAggregate createOrderAggregate);
    /* 需支付的活动订单---积分兑换活动次数 */
    void doSaveCreditPayOrder(CreateQuotaOrderAggregate createQuotaOrderAggregate);

    /* 缓存活动sku库存 */
    void cacheActivitySkuStockCount(String cacheKey, Integer stockCount);

    /* 扣减sku活动库存---redis缓存(如果为0，向mq发送延迟队列清空 信号) */
    boolean subtractionActivitySkuStock(Long sku, String cacheKey, Date endDateTime);

    /* sku活动库存消费发送至 Redis延迟队列*/
    void activitySkuStockConsumeSendQueue(ActivitySkuStockKeyVO activitySkuStockKeyVO);

    /* 获取延迟队列中的‘sku库存扣减值’ redis延迟队列*/
    ActivitySkuStockKeyVO takeQueueValue();
    /* 获取不同的“sku”的库存扣减延迟队列 redis延迟队列 */
    ActivitySkuStockKeyVO takeQueueValue(Long sku);

    /* 当sku库存为0时，清空仍请求库存扣减的请求 供mq消费者使用 */
    void clearQueueValue();
    void clearQueueValue(Long sku);

    /* 更新sku活动库存 sql*/
    void updateActivitySkuStock(Long sku);
    /* 清空sku活动库存 sql */
    void clearActivitySkuStock(Long sku);
    /* 查询sku列表：一个活动可能会配置多个sku，所以每个sku的Redis key必须独立 */
    List<Long> querySkuList();

    /* 查询未使用过的用户活动抽奖订单 */
    UserRaffleOrderEntity queryNoUsedRaffleOrder(PartakeRaffleActivityEntity partakeRaffleActivityEntity);

    /* 查询用户活动账户总(镜像)、日、月库存信息 */
    ActivityAccountEntity queryActivityAccountByUserId(String userId, Long activityId);
    ActivityAccountMonthEntity queryActivityAccountMonthByUserId(String userId, Long activityId, String month);
    ActivityAccountDayEntity queryActivityAccountDayByUserId(String userId, Long activityId, String day);

    /* 保存用户参与活动的聚合对象---活动用户账户库存扣减、用户抽奖活动订单入库 */
    void saveCreatePartakeOrderAggregate(CreatePartakeOrderAggregate createPartakeOrderAggregate);

    /* 根据活动id查询所有的sku-activity信息 */
    List<ActivitySkuEntity> queryActivitySkuListByActivityId(Long activityId);

    /* 根据 用户id+活动id 查询抽奖活动 总 参与次数*/
    Integer queryRaffleActivityAccountPartakeCount(Long activityId, String userId);

    /* 根据 用户id+活动id 查询抽奖活动 日 参与次数*/
    Integer queryRaffleActivityAccountDayPartakeCount(Long activityId, String userId);

    /* 根据 用户id+活动id 查询抽奖活动 总、月、日参与次数---更精确：是分别重新从月、日查询出来后和总的进行拼接*/
    ActivityAccountEntity queryActivityAccountEntity(Long activityId, String userId);

    void updateOrder(DeliveryOrderEntity deliveryOrderEntity);

    UnpaidActivityOrderEntity queryUnpaidActivityOrder(SkuRechargeEntity skuRechargeEntity);

    List<SkuProductEntity> querySkuProductEntityListByActivityId(Long activityId);

}
